package br.trainee.web.bo.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.inject.Inject;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

import br.trainee.web.dao.service.ICidadeDAO;
import br.trainee.web.dao.service.IClinicaDAO;
import br.trainee.web.dao.service.IEntityDAO;
import br.trainee.web.dao.service.IEstadoDAO;
import br.trainee.web.dao.service.IStatusDAO;
import br.trainee.web.dao.service.ITipoTelefoneDAO;
import br.trainee.web.util.UtilFuncoes;
import br.trainee.web.vo.CidadeVO;
import br.trainee.web.vo.ClinicaVO;
import br.trainee.web.vo.EmailClinicaVO;
import br.trainee.web.vo.EnderecoClinicaVO;
import br.trainee.web.vo.EstadoVO;
import br.trainee.web.vo.StatusVO;
import br.trainee.web.vo.TelefoneClinicaVO;
import br.trainee.web.vo.TipoTelefoneVO;

public class ClinicaBO extends EntityBOImpl<ClinicaVO, Long> implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	@Inject
	private IClinicaDAO dao;
	
	@Inject
	private Logger log;
	
	@Inject
	private ITipoTelefoneDAO tipoTelefone;
	
	@Inject
	private IEstadoDAO estado;
	
	@Inject
	private ICidadeDAO cidade;
	
	@Inject
	private IStatusDAO status;
	
	@Override
	public IEntityDAO getEntityDao() {
		
		return this.dao;
	}
	

	@Override
	public Logger getLogger() {
	
		return this.log;
	}
	
	public List<ClinicaVO> consultarClinicaPorNomeECnpj(String nomeClinica, String cnpj){
		
		List<ClinicaVO> listaClinicas = null;
		
		try{
			
			listaClinicas = dao.consultarClinicaPorNomeECnpj(nomeClinica, cnpj);
			
		}
		catch(Exception e){
			
			log.log(Level.SEVERE, e.getMessage());
			
			listaClinicas = null;
		}
		
		return listaClinicas;
	}
	
	@Override
	public boolean alterar(ClinicaVO clinica) {
		
		try{
			
			dao.alterar(clinica);
		}
		catch(Exception e){
			
			e.printStackTrace();
			log.log(Level.SEVERE, e.getMessage());
			
			return false;
		}
		
		return true;
	}
	
	public EmailClinicaVO consultarEmailPorId(Long idEmail){
		
		EmailClinicaVO email = null;
		try{
			
			email = dao.consultarEmailPorId(idEmail);
		}
		catch(Exception e){
			log.log(Level.SEVERE, e.getMessage());
			
			email = null;
		}
		
		return email;
	}
	
	public boolean excluirClinica(ClinicaVO clinica){
		
		try{
			
			dao.excluirClinica(clinica);
		}
		catch(Exception e){
			e.printStackTrace();
			//log.log(Level.SEVERE, e.getMessage());
			
			return false;
		}
		
		return true;
	}
	
	public boolean excluirEmail(EmailClinicaVO email){
		
		try{
			
			dao.excluirEmailClinica(email);
		}
		catch(Exception e){
			log.log(Level.SEVERE, e.getMessage());
			
			return false;
		}
		
		return true;
	}
	
	public boolean excluirEndereco(EnderecoClinicaVO endereco){
		
		try{
			
			dao.excluirEnderecoClinica(endereco);
		}
		catch(Exception e){
			log.log(Level.SEVERE, e.getMessage());
			
			return false;
		}
		
		return true;
	}
	
	public boolean excluirTelefone(TelefoneClinicaVO telefone){
		
		try{
			
			dao.excluirTelefoneClinica(telefone);
		}
		catch(Exception e){
			
			log.log(Level.SEVERE, e.getMessage());
			
			return false;
		}
		
		return true;
	}
	
	public List<TelefoneClinicaVO> consultarTelefonePorIdClinica(Long idClinica){
		List<TelefoneClinicaVO> listaTelefone = null;
		
		try{
			
			listaTelefone = dao.consultarTelefonePorIdClinica(idClinica);
			
		}
		catch(Exception e){
			
			log.log(Level.SEVERE, e.getMessage());
			
			listaTelefone = null;
		}
		
		return listaTelefone;
	}
	
	public List<EmailClinicaVO> consultarEmailPorIdClinica(Long idClinica){
		List<EmailClinicaVO> listaEmail = null;
		
		try{
			
			listaEmail = dao.consultarEmailPorIdClinica(idClinica);
			
		}
		catch(Exception e){
			
			log.log(Level.SEVERE, e.getMessage());
			
			listaEmail = null;
		}
		
		return listaEmail;
	}
	
	public List<EnderecoClinicaVO> consultarEnderecoPorIdClinica(Long idClinica){
		List<EnderecoClinicaVO> listaEndereco = null;
		
		try{
			
			listaEndereco = dao.consultarEnderecoPorIdClinica(idClinica);
		}
		catch(Exception e){
			
			log.log(Level.SEVERE, e.getMessage());
			
			listaEndereco = null;
		}
		
		return listaEndereco;
	}
	
	public EnderecoClinicaVO consultarEnderecoPorId(Long idEndereco){
		
		EnderecoClinicaVO endereco = null;
		
		try{
			
			endereco = dao.consultarEnderecoPorId(idEndereco);
		}
		catch(Exception e){
			log.log(Level.SEVERE, e.getMessage());
			
			endereco = null;
		}
		
		return endereco;
	}
	
	public TelefoneClinicaVO consultarTelefonePorId(Long idTelefone){
		
		TelefoneClinicaVO telefone = null;
		
		try{
			
			telefone = dao.consultarTelefonePorId(idTelefone);
		}
		catch(Exception e){
			
			log.log(Level.SEVERE, e.getMessage());
			
			telefone = null;
		}
		
		return telefone;
	}
	
	public ClinicaVO detalharClinica(Long idClinica){
		
		ClinicaVO clinica = new ClinicaVO();
		
		try{
			
			clinica = dao.detalharClinica(idClinica);
		}
		catch(Exception e){
			log.log(Level.SEVERE, e.getMessage());
			
			clinica = null;
		}
		
		return clinica;
	}
	
	public boolean alterarEmail(EmailClinicaVO email){
		try{
			
			dao.atlerarEmailClinica(email);	
		}
		catch(Exception e){
			log.log(Level.SEVERE, e.getMessage());
			return false;
		}
		
		return true;
	}
	
	public boolean alterarEndereco(EnderecoClinicaVO endereco){
		try{
			
			dao.alterarEnderecoClinica(endereco);
		}
		catch(Exception e){
			log.log(Level.SEVERE, e.getMessage());
			return false;
		}
		return true;
	}
	
	public boolean alterarTelefone(TelefoneClinicaVO telefone){
		try{
			
			dao.alterarTelefoneClinica(telefone);
		}
		catch(Exception e){
			log.log(Level.SEVERE, e.getMessage());
			return false;
		}
		
		return true;
	}
	
	@Override
	public boolean incluir(ClinicaVO clinica) {
		
		try{
			
			dao.incluir(clinica);
		}
		catch(Exception e){
			log.log(Level.SEVERE, e.getMessage());
			
			return false;
		}
		return true;
	}
	
	public StatusVO consultarStatusPorTipo(Integer tipoStatus){
		
		StatusVO statusRetorno = null;
		
		try{
			
			statusRetorno = status.consultarStatusPorTipo(tipoStatus);
			
		}
		catch(Exception e){
			
			log.log(Level.SEVERE, e.getMessage());
			
			statusRetorno = null;
		}
		
		return statusRetorno;
	}
	
	public List<TipoTelefoneVO> consultarTodosTipoTelefones(){
		
		List<TipoTelefoneVO> listaTipoTelefones = null;
		
		try{
			
			listaTipoTelefones = tipoTelefone.consultarTodos();
		}
		catch(Exception e){
			
			log.log(Level.SEVERE, e.getMessage());
			
			listaTipoTelefones = null;
		}
		
		return listaTipoTelefones;
	}
	
	public List<CidadeVO> consultarCidadePorEstado(Long idEstado){
		
		List<CidadeVO> listaCidades = null;
		
		try{
			
			listaCidades = cidade.consultarCidadePorEstado(idEstado); 
			
		}
		catch(Exception e){
			log.log(Level.SEVERE, e.getMessage());
			
			listaCidades = null;
		}
		
		
		return listaCidades;
	}
	
	public List<EstadoVO> consultarTodosEstados(){
		List<EstadoVO> listaEstados = null;
		try{
			
			listaEstados = estado.consultarTodos();
			
		}
		catch(Exception e){
			log.log(Level.SEVERE, e.getMessage());
			
			listaEstados = null;
		}
		
		return listaEstados;
	}
	
	
	public List<ClinicaVO> consultarClinicasPorNome(String nomeClinica){
		
		List<ClinicaVO> listaClinicas = null;
		
		try{
			
			listaClinicas = dao.consultarClinicaPorNome(nomeClinica);
		}
		catch(Exception e){
			
			log.log(Level.SEVERE, e.getMessage());
			
			listaClinicas = null;
		}
		
		return listaClinicas;
	}
	
	
	public boolean isVetorEmailValido(String[] vetorEmails){
		
		return vetorEmails != null;
	}
	
	public List<EmailClinicaVO> carregarListaEmailsValidos(String[] vetorEmails){
		
		List<EmailClinicaVO> listaEmails = new ArrayList<EmailClinicaVO>();
		
		if(isVetorEmailValido(vetorEmails)){
			
			for (String email : vetorEmails) {
				
				if(!isEmailInvalido(email)){
					
					EmailClinicaVO emailEntrada =  new EmailClinicaVO();
					
					emailEntrada.setEmailClinica(email);
					
					listaEmails.add(emailEntrada);
				}
				
			}
			
		}
		
		return listaEmails;
	}
	
	public JSONArray converterListaCidadesJson(List<CidadeVO> listaCidades){
		
		JSONArray vetorCidades = new JSONArray();
		
		for (CidadeVO cidade : listaCidades) {
			
			JSONObject jsonCidade = new JSONObject();
			
			jsonCidade.put("idCidade", cidade.getIdCidade());
			jsonCidade.put("nomeCidade", cidade.getNomeCidade());
			
			vetorCidades.add(jsonCidade);
		}
		
		
		return vetorCidades;
	}
	
	public boolean isNomeInvalido(String nome){
		
		return UtilFuncoes.isCampoVazio(nome);
	}
	
	public boolean isCnpjInvalido(String cnpj){
		
		return UtilFuncoes.isCampoVazio(cnpj);	
	}
	
	public boolean isDddInvalido(String ddd){
		
		return UtilFuncoes.isCampoVazio(ddd);
	}
	
	public boolean isTelefoneInvalido(String telefone){
		
		return UtilFuncoes.isCampoVazio(telefone);
	}
	
	public boolean isEstadoInvalido(String estado){
		
		return UtilFuncoes.isCampoComboValido(estado);
	}
	
	public boolean isCidadeInvalida(String cidade){
	
		return UtilFuncoes.isCampoComboValido(cidade);
	}
	
	public boolean isCepInvalido(String cep){
		
		return UtilFuncoes.isCampoVazio(cep);
		
	}
	
	public boolean isEmailInvalido(String email){
		
		return UtilFuncoes.isCampoVazio(email);
	}
	
	public boolean isLogradouroInvalido(String logradouro){
		
		return UtilFuncoes.isCampoVazio(logradouro);
	}
	
	public boolean isBairroInvalido(String bairro){
		
		return UtilFuncoes.isCampoVazio(bairro);
	}
	
	public boolean isTipoValido(String tipoTelefone){
		
		return UtilFuncoes.isCampoComboValido(tipoTelefone);
	}
	
	public boolean isTelefoneCompletoValido(Integer ddd, Long telefone, Long tipoTelefone){
		
		if(ddd !=null && telefone != null && tipoTelefone != 0l){
			return true;
		}
		
		return false;
	}
	
	public boolean isTamanhoTelefoneValido(Long telefone){
		
		return UtilFuncoes.validarTamanhoMaximoTelefone(telefone);
	}
	
	public boolean isTamanhoEmailValido(String email){
		
		return UtilFuncoes.validarTamanhoMaximoEmail(email);
	}
	
	public boolean isTamanhoDddValido(Integer ddd){
		
		return UtilFuncoes.validarTamanhoMaximoDDD(ddd);
	}
	
	public boolean isFormatoValido(String campo){
		
		return UtilFuncoes.verificarExtensaoImagem(campo);
	}
	
	public boolean isTamanhoImagemValido(Long campo){
		
		if(UtilFuncoes.converterByteParaMega(campo) > 10){
			
			return false;
		}
		
		return true;
	}


}
